﻿using System.Collections.Generic;
using System.Reflection;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Contratos;
using ClickLand.CorporacionPlaza.LogicaNegocio.Implementacion.ComandosPoliza;
using Logger;

namespace ClickLand.CorporacionPlaza.LogicaNegocio.Fabricas
{
    /// <summary> Clase que hace e fabrica para los comandos que involucran la entidad poliza </summary>
    public class FabricaComandosPoliza
    {
        /// <summary> Metodo que obtiene una instacia de un comando que consulta la lista de poliza de un contrato 
        /// en especifico </summary>
        /// <param name="idContrato">datos para la consulta</param>
        /// <returns></returns>
        public static IComando<List<Poliza>> ObtenerComandoConsultarLista(long idContrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new ConsultarLista(idContrato);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary>Metodo que obtiene una instancia de un comando que consulta polzia por parametros</summary>
        /// <param name="contrato">Parametros para la busqueda</param>
        /// <returns>Lista de polizas</returns>
        public static IComando<List<Poliza>> ObtenerComandoConsultar(Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new Consultar(contrato);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Metodo que obtiene una instancia de un comando que envia un correo  </summary>
        /// <param name="dias"></param>
        /// <param name="contrato"></param>
        public static IComando<bool> ObtenerComandoEnviarCorreo(int dias, Contrato contrato)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new EnviarCorreo(dias,contrato);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Metodo que obtiene una instancia de un comando que agrega o edita los datos de una poliza </summary>
        /// <param name="poliza">Datos a insertar o modificar</param>
        /// <returns>true si realizo la operacion false sino</returns>
        public static IComando<bool> ObtenerComandoAgregarEditar(Poliza poliza)
        {

            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            var retorno = new AgregarEditar(poliza);
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }


        /// <summary> Metodo que obtiene un comando que realiza la accion de vencimiento de polizas </summary>
        /// <returns>Comando que realiza la accion</returns>
        public static IComando<bool> ObtenerComandoVencerPolizas()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion

            var retorno = new VencerPolizas();
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
            return retorno;
        }
    }
}
